/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rmiclient;

import java.awt.BorderLayout;
import java.awt.FontMetrics;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import rmiserver.Trip;

/**
 * Таблица для отображения информации о маршрутах
 * @author alexxxey
 */
public class TripsPanel extends JPanel
{
    public TripsPanel()
    {          
        m_tripsList = new ArrayList<>();
        
        setBorder(new EmptyBorder(2, 2, 2, 2));  
        setLayout(new BorderLayout(0, 0)); 
  
        m_model = new DefaultTableModel(){  
            @Override  
            public boolean isCellEditable(int row, int column){  
                return false;  
            };
        };
        
        m_model.addColumn("Номер");        
        m_model.addColumn("Дата");
        m_model.addColumn("Время");
        m_model.addColumn("Места");
        m_model.addColumn("Пункты назначения");
                        
        m_table = new JTable(m_model);                   
        m_table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        
        m_fm = m_table.getFontMetrics(m_table.getFont());
        m_table.setRowHeight(2*m_fm.getHeight());
                 
        for (int i=0; i<m_table.getColumnCount(); ++i)
        {
            if (i < m_table.getColumnCount()-1)
            {  
                m_table.getColumnModel().getColumn(i).setMaxWidth(COLUIMN_WIDTH[i]);                                                           
            }   
                        
            DefaultTableCellRenderer cr = new DefaultTableCellRenderer();
            cr.setHorizontalAlignment(JTextField.CENTER);
            m_table.getColumnModel().getColumn(i).setCellRenderer(cr);
            
        }                      
                
        JScrollPane scrollPane = new JScrollPane(m_table);  
        add(scrollPane, BorderLayout.CENTER);                
    }   
    
    /**
     * Добавление маршрутов в таблицу
     * @param trips Список маршрутов
     */
    public void addTripList(ArrayList<Trip> trips)
    {           
        int rowCnt = m_model.getRowCount();
        for (int i=rowCnt-1; i>=0; --i)
        {
            m_model.removeRow(i);
        }
        
        if (!trips.isEmpty())  
        {
            m_tripsList.clear();                        
            m_tripsList = new ArrayList<>(trips);

            for (Trip t : m_tripsList)
            {
                addTrip(t);
            }

            m_table.setRowSelectionInterval(0, 0);
        }                        
    }
    
    /**
     * Получение объекта с информацией о маршруте, связанного
     * со строкой в таблице
     * @return Выбраный маршрут
     */
    public Trip getSelectionTrip()
    {        
        int rowIdx = m_table.getSelectedRow();        
        return (rowIdx==-1 ? null : m_tripsList.get(rowIdx));
    }
    
    /**
     * Добавление одного маршрута в таблицу
     * @param trip Маршрут
     */
    private void addTrip(Trip trip)
    {
        String destStr = "";
        ArrayList<String> destArr = trip.getDestinations();                        
        for (int i=0; i<destArr.size(); ++i)
        {  
            destStr = destStr + destArr.get(i);
            if (i<destArr.size()-1)
                destStr = destStr + ", ";
        }        
        
        String[] rowData = {new Integer(trip.getTripId()).toString(), 
                    trip.getDate().toString(), trip.getTime().toString(),
                    new Integer(trip.getPlacesNum()).toString(), 
                    destStr};                 
                        
        m_model.addRow(rowData);           
    }
    
    private ArrayList<Trip> m_tripsList;
    
    private JTable m_table;  
    private DefaultTableModel m_model;
    
    private FontMetrics m_fm;    
    private final static int[] COLUIMN_WIDTH = {60, 120, 100, 60};
}
